package vip.liux.contracts.models.pay;

import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import vip.liux.contracts.infrastructure.pay.dto.refund.ClientPayRefundDto;
import vip.liux.contracts.shared.enums.pay.PayRefundStatus;
import vip.liux.domain.entities.auditing.CreationAuditedEntity;

import java.math.BigDecimal;
import java.time.LocalDateTime;

@Getter
@Setter
@Entity
@Table(name = "pay_refund")
@Accessors(chain = true)
public class PayRefund extends CreationAuditedEntity<Long> {

    /**
     * 外部退款号，根据规则生成
     * <p>
     * 调用支付渠道时，使用该字段作为对接的退款号：
     * 1. 微信退款：对应 <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4">申请退款</a> 的 out_refund_no 字段
     * 2. 支付宝退款：对应 <a href="https://opendocs.alipay.com/open/02e7go"统一收单交易退款接口></a> 的 out_request_no 字段
     */
    private String refundNo;

    /**
     * 应用编号
     * <p>
     * 关联 {@link PayApp#getId()}
     */
    private Long appId;
    /**
     * 渠道编号
     * <p>
     * 关联 {@link PayChannel#getId()}
     */
    private Long channelId;
    /**
     * 渠道编码
     * <p>
     * 枚举 {@link PayChannel}
     */
    private String channelCode;

    /**
     * 支付订单编号
     * <p>
     * 冗余 {@link PayOrder#getOrderNo()}
     */
    private String orderNo;

    // ========== 商户相关字段 ==========
    /**
     * 商户订单编号
     * <p>
     * 例如说，内部系统 A 的订单号，需要保证每个 PayAppDO 唯一
     */
    private String merchantOrderId;
    /**
     * 商户退款订单号
     * <p>
     * 例如说，内部系统 A 的订单号，需要保证每个 PayAppDO 唯一
     */
    private String merchantRefundId;
    /**
     * 异步通知地址
     */
    private String notifyUrl;

    // ========== 退款相关字段 ==========
    /**
     * 退款状态
     * <p>
     * 枚举 {@link PayRefundStatus}
     */
    private PayRefundStatus status;

    /**
     * 支付金额，单位：元
     */
    private BigDecimal payPrice;
    /**
     * 退款金额，单位：元
     */
    private BigDecimal refundPrice;

    /**
     * 退款原因
     */
    private String reason;

    /**
     * 用户 IP
     */
    private String userIp;

    // ========== 渠道相关字段 ==========
    /**
     * 渠道订单号
     * <p>
     * 冗余 {@link PayOrder#getChannelOrderNo()}
     */
    private String channelOrderNo;
    /**
     * 渠道退款单号
     * <p>
     * 1. 微信退款：对应 <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_4">申请退款</a> 的 refund_id 字段
     * 2. 支付宝退款：没有字段
     */
    private String channelRefundNo;
    /**
     * 退款成功时间
     */
    private LocalDateTime successTime;

    /**
     * 调用渠道的错误码
     */
    private String channelErrorCode;
    /**
     * 调用渠道的错误提示
     */
    private String channelErrorMsg;

    /**
     * 支付渠道的同步/异步通知的内容
     * <p>
     * 对应 {@link ClientPayRefundDto#getRawData()}
     */
    private String channelNotifyData;

    // ALTER TABLE `zero-spring`.`pay_refund`
    // CHANGE COLUMN `no` `refund_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '退款单号' AFTER `id`;
}
